package com.yunyao.framework.excel;

import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import com.yunyao.common.core.redis.RedisCache;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * @author xingjishuai
 * @date 2024-07-24
 */
@Slf4j
@Component
public abstract class ExcelImportHandle<T> {
    @Autowired
    protected RedisCache redisCache;

    @Value("${default.material.category.id}")
    public String defaultMaterialCategoryId;
    @Value("${default.material.category.name}")
    public String defaultMaterialCategoryName;
    @Value("${default.material.category.code}")
    public String defaultMaterialCategoryCode;

    /**
     * 导入Excel文件
     *
     * @param file      上传的Excel文件
     * @param clazz     要导入的实体类类型
     * @param titleRows 标题行，默认为0，表示第一行是标题行
     * @param headRows  表头行，默认为1
     * @return 导入的数据列表
     * @throws IOException 如果文件读取失败，则抛出IO异常
     */
    public List<T> importExcel(MultipartFile file, Class<T> clazz, int titleRows, int headRows) throws IOException {
        if (file == null || StringUtils.isBlank(file.getOriginalFilename())) {
            throw new IllegalArgumentException("文件不能为空！");
        }
        // 校验文件格式
        if (!FilenameUtils.getExtension(file.getOriginalFilename()).equalsIgnoreCase("xlsx")
                &&!FilenameUtils.getExtension(file.getOriginalFilename()).equalsIgnoreCase("xls")) {
            throw new IllegalArgumentException("文件格式错误，只支持.xlsx / xls格式");
        }

        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headRows);

        try (java.io.InputStream is = file.getInputStream()) {
            return ExcelImportUtil.importExcel(is, clazz, params);
        } catch (Exception e) {
            log.error("导入Excel文件异常", e);
            throw new RuntimeException(e);
        }
    }

    /**
     * 导入Excel文件（使用默认参数）
     *
     * @param file  上传的Excel文件
     * @param clazz 要导入的实体类类型
     * @return 导入的数据列表
     * @throws IOException 如果文件读取失败，则抛出IO异常
     */
    public List<T> importExcel(MultipartFile file, Class<T> clazz) throws IOException {
        return importExcel(file, clazz, 0, 1); // 默认第一行是标题，第二行是表头
    }

    // 其他可能的通用方法...

    // 由于这是一个抽象工具类，你可能需要定义一些抽象方法或者提供默认实现，具体取决于你的需求。
    // 例如，你可能需要定义一个抽象方法来处理导入后的数据。

    // public abstract void handleImportedData(List<T> data);



}
